package com.qf.fmall.user.service.impl;

import cn.hutool.crypto.SecureUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.qf.fmall.user.entity.User;
import com.qf.fmall.user.mapper.UserMapper;
import com.qf.fmall.user.service.IUserService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.qf.fmall.user.vo.UserRegistRequestVo;
import com.qf.fmall.utils.SaltUtils;
import org.springframework.stereotype.Service;

import java.util.Date;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author djl
 * @since 2024-04-24
 */
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService {

    @Override
    public void regist(UserRegistRequestVo vo) {

        //1. 对vo进行参数校验

        //2. 判断当前的用户名是否重复了，如果重复了抛出异常
        String username = vo.getUsername();
        // 如何调用这个类继承的实例方法（getOne）呢？
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        wrapper.eq("username",username);

        User dbuser = this.getOne(wrapper);
        if (dbuser!=null){
            // 该用户名已经存在了
            throw new RuntimeException("用户名在数据库中已经存在了");
        }

        //3. 处理 password 不要使用明文
        // 生成一个指定长度的随机 salt
        String salt = SaltUtils.createSalt(8);
        String saltPassword = vo.getPassword() + salt;
        String md5Password = SecureUtil.md5(saltPassword);

        //4. 处理注册时间和修改时间
        User user = new User();
        user.setUserRegtime(new Date());
        user.setUserModtime(new Date());

        //5. 收集User对象的其他信息
        user.setSalt(salt);
        user.setPassword(md5Password);
        user.setUsername(vo.getUsername());

        //6. 保存到数据库
        this.save(user);

    }

    @Override
    public User login(String username, String password) {

        //1. 根据username查询用户表
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        wrapper.eq("username",username);

        User dbuser = this.getOne(wrapper);
        if (dbuser==null){
            // 没有对应的用户
            throw new RuntimeException("用户名应用的用户不存在");
        }

        //2. 检测password是否匹配
        String dbpassword = dbuser.getPassword();
        String salt = dbuser.getSalt();
        // 重新计算用户输入的密码+salt的md5值
        String md5Password = SecureUtil.md5(password + salt);

        if (!dbpassword.equals(md5Password)){
            throw new RuntimeException("用户密码错误");
        }

        //3. 返回user对象
        // 去掉user中的敏感信息
        dbuser.setPassword("*****");
        dbuser.setSalt("*****");

        return dbuser;
    }
}
